如何查看微信image/*.dat文件

您所在的位置:网站首页 微信image url 如何查看微信image/*.dat文件

如何查看微信image/*.dat文件

#如何查看微信image/*.dat文件| 来源: 网络整理| 查看: 265

背景: 起因我是想看看能不能获取的到撤回的图片, 于是在*\WeChat Files\*\FileStorage\Image这个文件下发现了聊天记录储存的文件, 却发现文件已被加密... 也就有了这篇文章...

关于撤回的图片这个问题, 结论是获取不到, 聊天记录里加密的图片也删除了..., 不过该文章的方法可以获取到原来聊天记录的图片

在这里插入图片描述

图片文件的每个字节 异或 机器随机的一个值, 对此进行的加密

下图为普通JPG文件. JPG文件的文件头为 0xFF, 0xD8 在这里插入图片描述

下图为image文件夹下某Dat文件, 文件头为0x63, 0x44 在这里插入图片描述

通过 0xFF异或 0x63 取值可以得到加密码为 9c (此处可以用第二位 0xD8 0x44 来反向验证), 之后便可以通过该值9c对全文件进行异或操作, 即可以得到原始图片文件.

不过此处我只是举了JPG图片的例子, 对于不同文件, 例如png, gif, bmp, 文件头都不一致, 因此还需按需调整.

见代码

import { argv } from 'process'; import { open } from 'fs/promises'; // JPEG (jpg),文件头:FFD8FF // PNG (png),文件头:89504E47 // GIF (gif),文件头:47494638 const JPG_HEADER = [0xFF, 0xD9]; const PNG_HEADER = [0x89, 0x50]; const GIF_HEADER = [0x47, 0x49]; let readFile; let writeFile; let fileTypeObj; function xorOpeartion(fileTypeArr = [], fileHeaderBuffer = []) { const fileCode = fileTypeArr[0] ^ fileHeaderBuffer[0]; let returnValue = { isTrue: false, fileCode: null, } if (fileCode ^ fileHeaderBuffer[1] === fileTypeArr[1]) { returnValue.isTrue = true; returnValue.fileCode = fileCode; } return returnValue; } function getFileType(fileHeaderBuffer) { const fileTypeArr = [ { type: 'jpg', value: JPG_HEADER}, { type: 'png', value: PNG_HEADER}, { type: 'gif', value: GIF_HEADER}, ]; let returnValue = { isTrue: false, fileCode: null, fileType: null, }; for (let item of fileTypeArr) { returnValue = { ...returnValue, ...xorOpeartion(item.value, fileHeaderBuffer) }; if (returnValue.isTrue) { returnValue.fileType = item.type; break; } } return returnValue; } try { readFile = await open(argv[2], 'r') let fileHeaderBuffer = Buffer.alloc(2); await readFile.read({ buffer: fileHeaderBuffer, }); fileTypeObj = getFileType(fileHeaderBuffer); if (!fileTypeObj.isTrue) { // 即无匹配文件 throw new Error('不属于jpg, png, gif文件, 解码失败'); } writeFile = await open(`${argv[2]}.${fileTypeObj.fileType}`, 'w') // 解码文件 const readStream = readFile.createReadStream({ start: 0, }); const writeStream = writeFile.createWriteStream(); readStream.on('data', (chunk) => { let isOk = true; let finalData = []; for (let dataEachItem of chunk) { finalData.push(dataEachItem ^ fileTypeObj.fileCode); } isOk = writeStream.write(Buffer.from(finalData)); if (!isOk) { readStream.pause(); writeStream.once('drain', () => { readStream.resume(); }); } console.log(`Received ${chunk.length} bytes of data.`); }); readStream.on('end', () => { console.log('End'); writeStream.end(); }) } catch (error) { console.log(`Usage: node ${argv[1]} `); console.log(error); } 复制代码

如何使用: node 上述代码

在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3